home *** CD-ROM | disk | FTP | other *** search
-
- /*
- “THcalc”簡易計算機
-
- By 五味(93/01/15 ~)
-
- */
-
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
-
- #define ENZ 4 /* 総演算子数 */
- #define FULL (char *)0xffff /* フルポインタ */
- #define ENZN 0xff /* ヌル演算子 */
-
- char *mark[]={ "*","/","+","-" };
- /* 演算子一覧 */
-
-
-
- int expr(char *siki,int enz) /* 演算本体 */
- {
- static int i; /* 汎用(ループ等) */
- auto char *p; /* 汎用ポインタ */
- auto int enzk; /* 掛かっている演算子 */
- auto int val,tval; /* 一時的な値 */
- auto char *lesp,*tmp; /* 演算子のポインタ */
-
-
- for( ; *siki=='\t' || *siki==' ' ; siki++ ); /* 値の先頭へ移動 */
-
-
- if( *siki=='(' ) /* 演算元の算出 */
- {
- for( i=1,p=(++siki) ; i!=0 && *p!='\0' ; p++ )
- if( *p=='(' )
- i++;
- else
- if( *p==')' )
- i--;
- if( i )
- {
- printf(" 括弧が異常です.\n");
- exit(1);
- }
- else
- *(p-1)='\0';
-
- tval = expr(siki,ENZN);
- siki = p;
- } /* 括弧内 */
- else
- tval=atoi(siki); /* 定数 */
-
-
-
- for( i=0,enzk=ENZN,lesp=FULL ; i<ENZ ; i++ )
- if( (tmp=strstr(siki,mark[i]))!=NULL && tmp<lesp )
- {
- lesp=tmp;
- enzk=i;
- } /* 後ろの演算子を割り出す */
-
-
- if( enzk<=enz && enzk!=ENZN ) /* 演算子ごとの演算 */
- {
- val = expr(lesp+strlen(mark[enzk]),enzk);
-
- switch(enzk)
- {
- case 0:
- val = tval * val;
- break;
- case 1:
- val = tval / val;
- break;
- case 2:
- val = tval + val;
- break;
- case 3:
- val = tval - val;
- break;
- }
- }
- else
- val = tval;
-
-
- return(val); /* 演算後の値を返却 */
- }
-
-
-
-
- int main(int argc,char *argv[])
- {
-
- char str[128]; /* 式複写用バッファ */
-
- if( argc!=2 )
- {
- printf("\n");
- printf(" “THcalc”簡易計算機 V1.1\n");
- printf(" (c) Hisashi Gomi 93/01/15 \n\n");
-
- if( argc>2 )
- {
- printf(" 式には空白を挟めません.\n");
- return(2);
- }
- else
- {
- printf(" [使い方] THcalc <式>\n");
- return(0);
- }
-
- }
-
-
- strcpy(str,argv[1]); /* expr()が文字列を破壊するため */
- printf("\n %s = %d\n",argv[1],expr(str,ENZN) );
-
- return(0);
- }
-